package com.example.theoretical_verification.collection;

import java.util.Comparator;
import java.util.TreeMap;
import java.util.TreeSet;

public class MyTreeMap02 {
    public static void main(String[] args) {
        TreeMap<Student01, Integer> treeMap = new TreeMap<>(new Comparator<Student01>() {
            @Override
            public int compare(Student01 o1, Student01 o2) {
                // o2在前，o1在后，应该就是按照名字来逆序吧
                int num = o2.getName().compareTo(o1.getName());
                // 名字相同按年龄逆序.也是o2在前，o1在后
                return num == 0 ? o2.getAge() - o1.getAge() : num;
            }
        });

        // 这个案例，现在不报错了
        Student01 s = new Student01("E", 12);
        treeMap.put(s, 0);
        Student01 s1 = new Student01("B", 23);
        treeMap.put(s1, 1);
        Student01 s2 = new Student01("D", 25);
        treeMap.put(s2, 2);
        Student01 s3 = new Student01("A", 35);
        treeMap.put(s3, 3);
        Student01 s4 = new Student01("C", 15);
        treeMap.put(s4, 4);
        Student01 s5 = new Student01("A", 21);
        treeMap.put(s5, 5);

        System.out.println(treeMap);

        // 实际打印结果，符合比较器预期，名字、年龄逆序排列
        // {Student{name='E', age=12}
        //=0, Student{name='D', age=25}
        //=2, Student{name='C', age=15}
        //=4, Student{name='B', age=23}
        //=1, Student{name='A', age=35}
        //=3, Student{name='A', age=21}
        //=5}
        // 注意，TreeMap、TreeSet，都是基于TreeMap实现的。所以，要指定它们的排序规则的套路大致相同。要么元素实现比较接口，要么构造函数给个比较器的实现类的实例对象。
        // TreeMap是依据Key来排序的哦。我这里的Key给的是Student，那么，它就按照我们实现的比较规则把Student01排序。
        // 如果我们的key给的是String、Inter呢，其实就不用给String、Inter实现Comparable接口，因为java默认给它们都实现了，是自然顺序的升序。如果想要其他顺序，那自己再在TreeMap构造器给比较器指定。

    }
}
